#!/bin/bash
# 设置 -e 选项，如果任何命令失败，脚本会立即退出，这对于CI/CD至关重要
set -e

# --- 1. 从环境变量获取参数 (由 Jenkins 传入) ---
# BUILD_VERSION 和 BUILD_TYPES 是你在 Jenkins UI 中配置的参数名称
version_number="$BUILD_VERSION"
build_type_from_jenkins="$BUILD_TYPES"

# --- 2. 验证从 Jenkins 传入的参数 ---
echo "================================================="
echo "Jenkins 传入的参数:"
echo "版本号 (BUILD_VERSION): ${version_number}"
echo "构建类型 (BUILD_TYPES): ${build_type_from_jenkins}"
echo "================================================="

# 验证版本号是否为空
if [ -z "$version_number" ]; then
    echo "错误：环境变量 BUILD_VERSION 未设置！"
    exit 1
fi

# 验证版本号格式
if [[ ! $version_number =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
    echo "错误：版本号格式不正确，必须是 x.y.z 格式。"
    exit 1
fi

# 将 Jenkins 传入的构建类型 (Debug/Release) 转换为小写，以匹配脚本逻辑
build_type=$(echo "$build_type_from_jenkins" | tr '[:upper:]' '[:lower:]')

# 验证构建类型是否有效
if [[ "$build_type" != "debug" && "$build_type" != "release" ]]; then
    echo "错误：无效的构建类型。必须是 'Debug' 或 'Release'。"
    exit 1
fi

echo "解析后的构建参数:"
echo "版本号: ${version_number}"
echo "构建类型: ${build_type}"
echo "================================================="

# 设置默认项目目录（如果未定义）
projectDir="${projectDir:-$(pwd)}"
echo "当前项目目录：${projectDir}"
echo "请确认项目目录是否正确。如果不正确，请设置 projectDir 变量，例如："
echo "export projectDir=/path/to/your/project"

## 清理项目
echo "清理当前项目..."
flutter clean
rm -rf .dart_tool/flutter_build/
if [ -d "${projectDir}/.android/build" ]; then
    rm -rf "${projectDir}/.android/build"
    echo "清理 .android/build 目录完成！"
else
    echo "提示：.android/build 目录不存在，跳过清理..."
fi
flutter pub get

# 更新 publish.gradle 中的 buildType
PUBLISH_GRADLE="${projectDir}/publish.gradle"
echo "更新 ${PUBLISH_GRADLE} 中的 buildType 为 ${build_type}..."
if [ -f "$PUBLISH_GRADLE" ]; then
    # 检查文件是否可写
    if [ ! -w "$PUBLISH_GRADLE" ]; then
        echo "错误：${PUBLISH_GRADLE} 不可写，请检查文件权限！"
        exit 1
    fi
    # 使用 sed 更新 buildType 变量
    sed -i '' "s/def buildType = '.*'/def buildType = '${build_type}'/" "$PUBLISH_GRADLE"
    if [ $? -eq 0 ]; then
        echo "成功更新 publish.gradle 中的 buildType 为 ${build_type}！"
    else
        echo "错误：更新 publish.gradle 失败！"
        exit 1
    fi
else
    echo "错误：${PUBLISH_GRADLE} 不存在！"
    exit 1
fi

# 第一步：打包前准备
echo "开始打包前准备..."

# 修改 Flutter/build.gradle
FLUTTER_BUILD_GRADLE="${projectDir}/.android/Flutter/build.gradle"
echo "目标文件路径：${FLUTTER_BUILD_GRADLE}"
if [ -f "$FLUTTER_BUILD_GRADLE" ]; then
    # 检查文件是否可写
    if [ ! -w "$FLUTTER_BUILD_GRADLE" ]; then
        echo "错误：${FLUTTER_BUILD_GRADLE} 不可写，请检查文件权限！"
        echo "尝试：chmod +w ${FLUTTER_BUILD_GRADLE}"
        exit 1
    fi

    echo "检查并修改 Flutter/build.gradle..."

    # 检查是否已存在 buildscript 块
    if ! grep -q "buildscript {" "$FLUTTER_BUILD_GRADLE"; then
        echo "添加 buildscript 块..."
        # 在文件顶部添加 buildscript 块
        sed -i '' '1i\
              buildscript {\
                  repositories {\
                      google()\
                      mavenCentral()\
                      maven {\
                          url "https://jitpack.io"\
                          content {\
                              includeGroup("com.github.aasitnikov")\
                          }\
                      }\
                  }\
                  dependencies {\
                      classpath "com.github.aasitnikov:fat-aar-android:1.4.2"\
                  }\
              }\
              ' "$FLUTTER_BUILD_GRADLE"
    else
        echo "buildscript 块已存在，跳过添加..."
    fi


    # 添加 dependencies_gradle_plugin.gradle 引用
    if ! grep -q "apply from: \"../dependencies_gradle_plugin.gradle\"" "$FLUTTER_BUILD_GRADLE"; then
        echo "apply from: \"../dependencies_gradle_plugin.gradle\"" >> "$FLUTTER_BUILD_GRADLE"
    fi

    # 禁用混淆和资源压缩
    if ! grep -q "minifyEnabled true" "$FLUTTER_BUILD_GRADLE"; then
        echo "开启代码混淆和资源压缩..."
        # 在 buildTypes 块中添加 minifyEnabled 和 shrinkResources 配置
        if grep -q "buildTypes {" "$FLUTTER_BUILD_GRADLE"; then
            # 如果 buildTypes 块存在，在 release 块中添加配置
            sed -i '' '/release {/a\
                minifyEnabled true\
                shrinkResources false' "$FLUTTER_BUILD_GRADLE"
        else
            # 如果 buildTypes 块不存在，添加完整的 buildTypes 块
            cat << EOF >> "$FLUTTER_BUILD_GRADLE"

android {
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources false
        }
    }
}
EOF
        fi
    fi

    echo "Flutter/build.gradle 修改完成！"
else
    echo "错误：${FLUTTER_BUILD_GRADLE} 不存在！"
    echo "请确认 projectDir 是否正确，或者手动指定文件路径。"
    exit 1
fi

# 修改 .android/build.gradle
BUILD_GRADLE="${projectDir}/.android/build.gradle"
echo "目标文件路径：${BUILD_GRADLE}"
if [ -f "$BUILD_GRADLE" ]; then
    # 检查文件是否可写
    if [ ! -w "$BUILD_GRADLE" ]; then
        echo "错误：${BUILD_GRADLE} 不可写，请检查文件权限！"
        exit 1
    fi

    echo "检查并修改 build.gradle..."
    # 添加 fat-aar 插件
    if ! grep -q "com.kezong.fat-aar" "$BUILD_GRADLE"; then
        sed -i '' '/apply plugin: "kotlin-android"/a\
apply plugin: "com.kezong.fat-aar"' "$BUILD_GRADLE"
    fi

    # 添加 buildscript 配置，使用 AGP 8.1.0
    if ! grep -q "com.github.kezong:fat-aar" "$BUILD_GRADLE"; then
        cat << EOF >> "$BUILD_GRADLE"

buildscript {
    repositories {
        google()
        mavenCentral()
        maven {
            url "https://jitpack.io"
            content {
                includeGroup("com.github.aasitnikov")
            }
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:8.1.0'
        classpath 'com.github.aasitnikov:fat-aar-android:1.4.2'
    }
}
EOF
    else
        # 确保 AGP 版本是 8.1.0
        sed -i '' 's/classpath *['\''"]com.android.tools.build:gradle:[0-9.]*['\''"]/classpath '\''com.android.tools.build:gradle:8.1.0'\''/' "$BUILD_GRADLE"
    fi

    echo "build.gradle 修改完成！"
else
    echo "错误：${BUILD_GRADLE} 不存在！"
    exit 1
fi

# 修改 .android/app/build.gradle，设置 NDK 版本
APP_BUILD_GRADLE="${projectDir}/.android/app/build.gradle"
echo "目标文件路径：${APP_BUILD_GRADLE}"
if [ -f "$APP_BUILD_GRADLE" ]; then
    # 检查文件是否可写
    if [ ! -w "$APP_BUILD_GRADLE" ]; then
        echo "错误：${APP_BUILD_GRADLE} 不可写，请检查文件权限！"
        exit 1
    fi

    echo "检查并修改 app/build.gradle，设置 NDK 版本..."
    if ! grep -q "ndkVersion" "$APP_BUILD_GRADLE"; then
        # 使用 awk 插入 ndkVersion，确保换行正确
        awk '/android {/ {print; print "    ndkVersion = \"27.0.12077973\""; next}1' "$APP_BUILD_GRADLE" > temp && mv temp "$APP_BUILD_GRADLE"
    fi

    echo "app/build.gradle 修改完成！"
else
    echo "警告：${APP_BUILD_GRADLE} 不存在，跳过修改..."
fi

# 修改 settings.gradle
SETTINGS_GRADLE="${projectDir}/.android/settings.gradle"
echo "目标文件路径：${SETTINGS_GRADLE}"
if [ -f "$SETTINGS_GRADLE" ]; then
    # 检查文件是否可写
    if [ ! -w "$SETTINGS_GRADLE" ]; then
        echo "错误：${SETTINGS_GRADLE} 不可写，请检查文件权限！"
        exit 1
    fi

    echo "检查并修改 settings.gradle..."
    if ! grep -q "apply from: \"./setting_gradle_plugin.gradle\"" "$SETTINGS_GRADLE"; then
        echo "apply from: \"./setting_gradle_plugin.gradle\"" >> "$SETTINGS_GRADLE"
    fi

    echo "settings.gradle 修改完成！"
else
    echo "错误：${SETTINGS_GRADLE} 不存在！"
    exit 1
fi

# 创建 dependencies_gradle_plugin.gradle
DEPENDENCIES_PLUGIN="${projectDir}/.android/dependencies_gradle_plugin.gradle"
echo "目标文件路径：${DEPENDENCIES_PLUGIN}"
if [ ! -f "$DEPENDENCIES_PLUGIN" ]; then
    echo "创建 dependencies_gradle_plugin.gradle..."
    cat << EOF > "$DEPENDENCIES_PLUGIN"
apply plugin: 'com.kezong.fat-aar'

fataar {
    transitive = false
}

dependencies {
    // 嵌入 Flutter 核心依赖
    def flutterSdkDir = rootProject.projectDir.parentFile.toPath()
    def flutterJar = new File(flutterSdkDir.toFile(), '.android/Flutter/build/intermediates/flutter/release/flutter.jar')
    if (flutterJar.exists()) {
        println "嵌入 Flutter 核心依赖: \${flutterJar.getAbsolutePath()}"
        embed files(flutterJar)
    } else {
        println "警告: Flutter 核心依赖文件 \${flutterJar.getAbsolutePath()} 不存在，跳过嵌入！"
    }

    // 嵌入 Flutter 插件依赖
    def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
    def plugins = new Properties()
    def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
    def totalPlugins = 0
    def includedPlugins = []

    println "检查 .flutter-plugins 文件: \${pluginsFile.getAbsolutePath()}"
    if (pluginsFile.exists()) {
        println ".flutter-plugins 文件存在，开始加载..."
        pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
        totalPlugins = plugins.size()
        println "加载 .flutter-plugins 成功，找到 \${totalPlugins} 个插件"
    } else {
        println "错误: .flutter-plugins 文件不存在，请确保已执行 'flutter pub get'！"
        System.exit(1)
    }

    plugins.each { name, path ->
        if (!name.endsWith('_linux') && !name.endsWith('_darwin') && !name.endsWith('_windows') && !name.endsWith('_web')) {
            def pluginAndroidDir = flutterProjectRoot.resolve(path).resolve('android').toFile()
            if (pluginAndroidDir.exists()) {
                try {
                    println "添加插件依赖: \${name} (路径: \${path})"
                    embed project(path: ":\${name}", configuration: 'default')
                    includedPlugins.add(name)
                } catch (Exception e) {
                    println "警告: 无法嵌入插件 \${name}，错误: \${e.getMessage()}"
                }
            } else {
                println "警告: 插件 \${name} 的 Android 模块不存在 (路径: \${pluginAndroidDir.getAbsolutePath()})，跳过嵌入！"
            }
        }
    }

    println "插件依赖处理完成:"
    println "  总插件数: \${totalPlugins}"
    println "  成功添加: \${includedPlugins.size()} 个插件 (\${includedPlugins})"
    println "  跳过: \${totalPlugins - includedPlugins.size()} 个插件"
    if (includedPlugins.size() == 0) {
        println "警告: 没有成功添加任何插件，请检查 .flutter-plugins 文件和插件配置！"
    }
}
configurations {
    embed
    api.extendsFrom(embed)
    implementation.extendsFrom(embed)
}
EOF
    echo "dependencies_gradle_plugin.gradle 创建完成！"
else
    echo "dependencies_gradle_plugin.gradle 已存在，跳过创建..."
fi

# 创建 setting_gradle_plugin.gradle
SETTING_PLUGIN="${projectDir}/.android/setting_gradle_plugin.gradle"
echo "目标文件路径：${SETTING_PLUGIN}"
if [ ! -f "$SETTING_PLUGIN" ]; then
    echo "创建 setting_gradle_plugin.gradle..."
    cat << EOF > "$SETTING_PLUGIN"
def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()

def plugins = new Properties()
def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
def totalPlugins = 0
def includedPlugins = []

println "检查 .flutter-plugins 文件: \${pluginsFile.getAbsolutePath()}"
if (pluginsFile.exists()) {
    println ".flutter-plugins 文件存在，开始加载..."
    pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
    totalPlugins = plugins.size()
    println "加载 .flutter-plugins 成功，找到 \${totalPlugins} 个插件"
} else {
    println "错误: .flutter-plugins 文件不存在，请确保已执行 'flutter pub get'！"
    System.exit(1)
}

// 首先处理主插件（非平台特定的插件）
plugins.each { name, path ->
    if (!name.contains('_linux') && !name.contains('_darwin') && !name.contains('_windows') && !name.contains('_web')) {
        def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
        if (pluginDirectory.exists()) {
            include ":\${name}"
            project(":\${name}").projectDir = pluginDirectory
            includedPlugins.add(name)
            println "添加插件 include: \${name} (路径: \${pluginDirectory.getAbsolutePath()})"
        } else {
            println "警告: 插件 \${name} 的 Android 模块不存在 (路径: \${pluginDirectory.getAbsolutePath()})，跳过包含！"
        }
    }
}

// 然后处理平台特定的插件，但只处理 Android 平台的
plugins.each { name, path ->
    if (name.endsWith('_android')) {
        def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
        if (pluginDirectory.exists()) {
            include ":\${name}"
            project(":\${name}").projectDir = pluginDirectory
            includedPlugins.add(name)
            println "添加插件 Android include: \${name} (路径: \${pluginDirectory.getAbsolutePath()})"
        } else {
            println "警告: 插件 \${name} 的 Android 模块不存在 (路径: \${pluginDirectory.getAbsolutePath()})，跳过包含！"
        }
    }
}

println "插件包含处理完成:"
println "  总插件数: \${totalPlugins}"
println "  成功包含: \${includedPlugins.size()} 个插件 (\${includedPlugins})"
println "  跳过: \${totalPlugins - includedPlugins.size()} 个插件"
if (includedPlugins.size() == 0) {
    println "错误: 没有成功包含任何插件，请检查 .flutter-plugins 文件和插件配置！"
    System.exit(1)
}
EOF
    echo "setting_gradle_plugin.gradle 创建完成！"
else
    echo "setting_gradle_plugin.gradle 已存在，跳过创建..."
fi

# 创建 proguard-rules.pro 文件
PROGUARD_FILE="${projectDir}/.android/Flutter/proguard-rules.pro"
echo "目标文件路径：${PROGUARD_FILE}"
if [ ! -f "$PROGUARD_FILE" ]; then
    echo "创建 proguard-rules.pro..."
    cat << EOF > "$PROGUARD_FILE"
# 保持默认构造函数，解决 R8 警告
-dontwarn java.lang.invoke.StringConcatFactory
-keep class java.lang.invoke.StringConcatFactory { *; }
-keep class com.google.vending.licensing.ILicensingService { void <init>(); }
-keep class com.android.vending.licensing.ILicensingService { void <init>(); }
-keep class com.google.android.vending.licensing.ILicensingService { void <init>(); }
-keep class android.support.annotation.Keep { void <init>(); }
-keep class **.R { void <init>(); }
-keep class * extends androidx.startup.Initializer { void <init>(); }
-keep class * implements androidx.versionedparcelable.VersionedParcelable { void <init>(); }
-keep class androidx.versionedparcelable.ParcelImpl { void <init>(); }
-keep class <1> { void <init>(); }
EOF
    echo "proguard-rules.pro 创建完成！"
else
    echo "proguard-rules.pro 已存在，跳过创建..."
fi

# 修改 AndroidManifest.xml，移除 package 属性
MANIFEST_FILE="${projectDir}/.android/Flutter/src/main/AndroidManifest.xml"
echo "目标文件路径：${MANIFEST_FILE}"
if [ -f "$MANIFEST_FILE" ]; then
    # 检查文件是否可写
    if [ ! -w "$MANIFEST_FILE" ]; then
        echo "错误：${MANIFEST_FILE} 不可写，请检查文件权限！"
        exit 1
    fi

    echo "检查并修改 AndroidManifest.xml，移除 package 属性..."
    sed -i '' 's/package="[^"]*"//' "$MANIFEST_FILE"
    echo "AndroidManifest.xml 修改完成！"
else
    echo "错误：${MANIFEST_FILE} 不存在！"
    exit 1
fi

# 构建 AAR
echo "构建 AAR..."
echo "执行 flutter build aar，生成 AAR 和 pom 文件..."
flutter build aar --build-number "$version_number" --no-profile --no-debug -v > build_aar.log 2>&1
if [ $? -eq 0 ]; then
    echo "flutter build aar 执行成功！版本号：${version_number}"
else
    echo "flutter build aar 执行失败！请检查 build_aar.log 获取详细信息。"
    exit 1
fi

echo "AAR 打包完成！版本号：${version_number}"


# --- [优化版] AAR 后处理：移除不需要的 ABI (使用 jar 命令) ---
echo "================================================="
echo "开始后处理 AAR，仅保留 arm64-v8a"

# 1. 精准定位 AAR 文件 (这部分保持不变)
AAR_PATH_IN_REPO="com/black/interview/interview_flutter/flutter_release/${version_number}"
AAR_FILE_NAME="flutter_release-${version_number}.aar"
AAR_FULL_PATH="${projectDir}/build/host/outputs/repo/${AAR_PATH_IN_REPO}/${AAR_FILE_NAME}"

if [ ! -f "$AAR_FULL_PATH" ]; then
    echo "错误：找不到生成的 AAR 文件：${AAR_FULL_PATH}"
    exit 1
fi

echo "找到待处理的 AAR 文件: ${AAR_FULL_PATH}"

# 2. 创建临时工作目录 (这部分保持不变)
TEMP_DIR=$(mktemp -d)
if [ ! -d "$TEMP_DIR" ]; then
    echo "错误：创建临时目录失败！"
    exit 1
fi
echo "创建临时工作目录: ${TEMP_DIR}"

# --- 关键修改：使用 jar 命令替代 unzip 和 zip ---

# 3. 解压 AAR (使用 jar xf)
echo "解压 AAR 到临时目录 (使用 jar)..."
(cd "$TEMP_DIR" && jar xf "$AAR_FULL_PATH")
if [ $? -ne 0 ]; then
    echo "错误：使用 jar 解压 AAR 失败！"
    rm -rf "$TEMP_DIR"
    exit 1
fi

# 4. 删除不需要的 ABI 文件夹 (这部分保持不变)
JNI_DIR="${TEMP_DIR}/jni"
if [ -d "$JNI_DIR" ]; then
    echo "正在检查 jni 目录..."
    rm -rf "${JNI_DIR}/armeabi-v7a"
    echo "已删除 armeabi-v7a 目录 (如果存在)。"
    rm -rf "${JNI_DIR}/x86_64"
    echo "已删除 x86_64 目录 (如果存在)。"
    rm -rf "${JNI_DIR}/x86"
    echo "已删除 x86 目录 (如果存在)。"
else
    echo "警告：AAR 中未找到 jni 目录，无需处理。"
fi

# 5. 重新打包 AAR (使用 jar cf)
echo "正在重新打包 AAR (使用 jar)..."
# 'c' - create, 'f' - file, 'M' - do not create a manifest file for the archive
# jar cfM <archive-file> <files-to-archive>
(cd "$TEMP_DIR" && jar cfM "$AAR_FULL_PATH" .)
if [ $? -eq 0 ]; then
    echo "成功重新打包 AAR，已覆盖原文件。"
else
    echo "错误：使用 jar 重新打包 AAR 失败！"
    rm -rf "$TEMP_DIR"
    exit 1
fi

# 6. 清理临时目录 (这部分保持不变)
echo "清理临时工作目录..."
rm -rf "$TEMP_DIR"

echo "AAR 后处理完成！现在 AAR 中只包含保留的 ABI。"
echo "================================================="
# --- [优化版代码结束] ---


echo "开始执行上传脚本..."

# 1. Append 'apply from: "../../publish.gradle"' to .android/Flutter/build.gradle
FLUTTER_BUILD_GRADLE="${projectDir}/.android/Flutter/build.gradle"
echo "目标文件路径：${FLUTTER_BUILD_GRADLE}"
if [ -f "$FLUTTER_BUILD_GRADLE" ]; then
    # Check if the file is writable
    if [ ! -w "$FLUTTER_BUILD_GRADLE" ]; then
        echo "错误：${FLUTTER_BUILD_GRADLE} 不可写，请检查文件权限！"
        echo "尝试：chmod +w ${FLUTTER_BUILD_GRADLE}"
        exit 1
    fi

    # Check if the line already exists to avoid duplication
    if ! grep -q "apply from: \"../../publish.gradle\"" "$FLUTTER_BUILD_GRADLE"; then
        echo "往 ${FLUTTER_BUILD_GRADLE} 添加 publish.gradle 引用..."
        echo "apply from: \"../../publish.gradle\"" >> "$FLUTTER_BUILD_GRADLE"
        if [ $? -eq 0 ]; then
            echo "成功添加 publish.gradle 引用！"
        else
            echo "错误：添加 publish.gradle 引用失败！"
            exit 1
        fi
    else
        echo "publish.gradle 引用已存在，跳过添加..."
    fi
else
    echo "错误：${FLUTTER_BUILD_GRADLE} 不存在！"
    exit 1
fi

# 2. Navigate to .android directory and execute publish.gradle
echo "进入 .android 目录并执行 publish.gradle..."
cd "${projectDir}/.android" || { echo "错误：无法进入 ${projectDir}/.android 目录！"; exit 1; }

# Check if publish.gradle exists
PUBLISH_GRADLE="${projectDir}/publish.gradle"

if [ "$build_type" = "release" ]; then
    sed -i '' "s/def versionRelease = '.*'/def versionRelease = '${version_number}'/" "$PUBLISH_GRADLE"
else
    sed -i '' "s/def versionDebug = '.*'/def versionDebug = '${version_number}'/" "$PUBLISH_GRADLE"
fi

if [ -f "$PUBLISH_GRADLE" ]; then
    echo "执行 Gradle 发布任务..."
    ./gradlew publish -PflutterVersion="${version_number}" -PbuildType="${build_type}"
    if [ $? -eq 0 ]; then
        if [ "$build_type" = "release" ]; then
            echo "✅ 发布任务成功完成！已成功发布到 Maven 仓库。版本号：${version_number}"
        else
            echo "✅ 发布任务成功完成！已成功发布到 Maven 仓库。版本号：${version_number}-SNAPSHOT"
        fi
    else
        echo "错误：执行 publish.gradle 失败！请检查 Gradle 日志。"
        exit 1
    fi
else
    echo "错误：${PUBLISH_GRADLE} 不存在！请确保 publish.gradle 文件已正确配置。"
    exit 1
fi

echo "<<<<<<<<<<<<<<<<<<<<<<<<<< 上传脚本执行结束 >>>>>>>>>>>>>>>>>>>>>>>>>"